package la.iok.hzsvn.lewin.movie.operation.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.UuidParam;
import la.iok.hzsvn.lewin.movie.operation.entity.MoviePlayer;
import la.iok.hzsvn.lewin.movie.operation.model.MoviePlayerVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.List;

public interface MoviePlayerService extends BaseService<MoviePlayer,Long> {

    /**
     * 用户加入开本记录
     * @param token 操作用户。应该是玩家
     * @param param 扫描的开本记录参数
     * @return 新增加的记录id
     */
    Long save(@NotNull Token token, @NotNull UuidParam param);

    /**
     * 查询用户的角色绑定信息
     * @param userId 用户id
     * @param playRecordId 开本记录id
     * @return 用户绑定的角色信息
     */
    @Nullable
    MoviePlayer select(@Nullable Long userId, @Nullable Long playRecordId);

    /**
     * 查询自己的角色绑定信息
     * @param token 操作用户,应该是玩家
     * @param id 玩家在剧本中的id
     * @return 玩家绑定角色信息
     */
    @Nullable
    MoviePlayerVo mine(@NotNull Token token, @Nullable Long id);

    /**
     * 播放记录所有已经加入的玩家列表
     * @param token 操作用户
     * @param playRecordId 播放记录id
     * @return 玩家列表
     */
    @NotNull
    @NotNullElement
    List<MoviePlayerVo> players(@NotNull Token token, @Nullable Long playRecordId);

    /**
     * 清除用户的角色
     * @param token 操作用户。必须是DM
     * @param id 用户加入剧本后的角色id
     */
    void clearRole(@NotNull Token token,@Nullable Long id);

    /**
     * 绑定用户的角色
     * @param token 操作用户
     * @param id 待绑定角色的剧本玩家id
     * @param playRoleId 剧本角色id
     */
    void bindRole(@NotNull Token token,@Nullable Long id,@Nullable Long playRoleId);

    /**
     * 将加入的用户移除出当前开本记录。可能有些人加入了，临时退出。删除之后如果需要重新加入，需要重新扫描开本记录二维码
     * @param token 操作用户,应该是DM或者玩家本人
     * @param id 用户绑定角色记录的id
     */
    void removeUser(@NotNull Token token,@Nullable Long id);
}
